package com.internetCafes.spms.web.certificate.service;

import com.internetCafes.spms.core.model.pageModel.DataGrid;
import com.internetCafes.spms.core.utils.R;
import com.internetCafes.spms.web.certificate.model.dto.transaction.BorrowOutReturnBatchDTO;
import com.internetCafes.spms.web.certificate.model.dto.transaction.TransactionReturnDTO;
import com.internetCafes.spms.web.certificate.model.vo.transaction.TransactionOutListVO;
import com.internetCafes.spms.web.certificate.entity.CertiTransactionInfo;
import com.internetCafes.spms.web.certificate.vo.CertiTransactionInfoVo;
import com.internetCafes.spms.web.certificate.vo.CollectInfo;

import java.util.List;
import java.util.Map;

/**
 * 证书借还历史
 *
 * @author Sunny
 */
public interface CertiTransactionInfoService {

    /**
     * 按参数查询出证书流转相关信息以及证书的idType
     *
     * @param params 筛选条件
     * @return 流转记录
     * @author Llz
     */
    List<CertiTransactionInfoVo> selectTransInfoAndIdtypeByParams(Map<String, Object> params);


    /**
     * 通过证书id进行删除遗留数据
     *
     * @param certificateId 证书id
     * @return 删除
     */
    Boolean deleteByCertificateId(Long certificateId);

    /**
     * 批量更新流转记录内容
     *
     * @param params 参数map
     * @author Zj
     */
    void updateTransactionBatch(Map<String, Object> params);

    /**
     * 获取对应证书的押证借出记录
     *
     * @param certificateIds 证书id
     * @return 接触记录
     * @author Zj
     */
    List<CertiTransactionInfo> getWarrantTransactionRecordByCertificateIds(List<Long> certificateIds);

    /**
     * 批量还回证书
     *
     * @param dto 请求参数
     * @author Zj
     */
    void borrowOutReturnBatch(BorrowOutReturnBatchDTO dto);


    /**
     * 证书还回数据修改
     *
     * @param dto 还回数据参数
     * @author Zj
     */
    void transactionReturnUpdate(TransactionReturnDTO dto);

    /**
     * 根据证书id 获取证书借出的项目列表
     *
     * @param certificateId 证书id
     * @return 证书借出项目记录
     * @author Zj
     */
    List<TransactionOutListVO> transactionOutProjects(Long certificateId);

    /**
     * 证书还回接口
     *
     * @param dto 换回参数
     * @author Zj
     */
    void transactionReturn(TransactionReturnDTO dto);

    /**
     * 根据证书id 获取证书对应人员手下所有证书流转记录
     *
     * @param params 参数
     * @return 证书流转记录
     * @author Zj
     */
    List<CertiTransactionInfoVo> queryEmployTransactions(Map<String, Object> params);

    /**
     * 证书借出记录修改接口
     *
     * @param certiTransactionInfo 证书信息
     * @return 记录
     * @author Zj
     */
    R certificateBorrowOutUpdate(CertiTransactionInfoVo certiTransactionInfo);

    /**
     * 检测证书是否支持继续借出
     *
     * @param certificateId 证书id
     * @return 获取借出记录列表
     * @author Zj
     */
    List<CertiTransactionInfo> checkTransactionOutList(Long certificateId);

    /**
     * 证书借出功能抽离
     *
     * @param certiTransactionInfo 借出传入参数
     * @author Zj
     */
    R certificateBorrowOut(CertiTransactionInfoVo certiTransactionInfo);

    /**
     * 证书是否支持借出
     *
     * @param transactionInfoVo 证书
     * @return t/f
     * @author Zj
     */
    boolean transactionOutAbleByCertificateVO(List<CertiTransactionInfo> certificateTransactions, CertiTransactionInfoVo transactionInfoVo);

    /**
     * 证书是否支持押人判断
     *
     * @param transactionInfoVo 证书
     * @return t/f
     * @author Zj
     */
    boolean detaineeAbleByCertificateVO(CertiTransactionInfoVo transactionInfoVo);

    /**
     * 证书是否支持押证判断
     *
     * @param transactionInfoVo       证书信息
     * @param certificateTransactions 流转记录列表
     * @return t/f
     * @author Zj
     */
    boolean warrantAbleByCertificateVO(List<CertiTransactionInfo> certificateTransactions, CertiTransactionInfoVo transactionInfoVo);

    /**
     * 查询
     */
    List<CertiTransactionInfo> query(Map<String, Object> params);

    /**
     * ID查询
     */
    CertiTransactionInfo findById(Long id);

    /**
     * ID批量查询
     */
    List<CertiTransactionInfo> queryByIds(List<Long> ids);

    /**
     * 参数分页查询
     */
    List<CertiTransactionInfo> page(Map<String, Object> params, int page, int rows);

    /**
     * 参数查询总数
     */
    long count(Map<String, Object> params);

    /**
     * 参数查询总数
     */
    long countByJobParams(Map<String, Object> params);

    /**
     * First查询
     */
    CertiTransactionInfo findFirst(Map<String, Object> params);

    /**
     * 保存
     */
    int save(CertiTransactionInfo certiTransactionInfo);

    /**
     * 保存资源记录
     */
    void saveResource(CertiTransactionInfoVo certiTransactionInfoVo);

    /**
     * 批量保存
     */
    int saveBatch(List<CertiTransactionInfo> certiTransactionInfoList);

    /**
     * 选择保存
     */
    int saveSelective(CertiTransactionInfo certiTransactionInfo);

    /**
     * 修改
     */
    int update(CertiTransactionInfo certiTransactionInfo);

    /**
     * 修改资源记录
     */
    void updateResource(CertiTransactionInfoVo vo);

    /**
     * 选择修改
     */
    int updateSelective(CertiTransactionInfo certiTransactionInfo);

    /**
     * 删除
     */
    int delete(Long id);

    /**
     * 批量删除
     */
    int deleteBatch(List<Long> ids);

    /**
     * 批量删除
     */
    void deleteBatch(Long[] ids);

    List<CollectInfo> CertiTransactionByJobParams(Map<String, Object> params);

    /**
     * DataGrid
     */
    DataGrid dataGrid(Map<String, Object> params, int pageNo, int pageSize);

    List<CertiTransactionInfoVo> selectByJobParams(Map<String, Object> params);
}
